package dao;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;

import modelo.Alquiler;
import modelo.Programacion;
import modelo.Persona;
import modelo.Cancha;
import util.ConexionBD;
import excepcion.DAOExcepcion;

public class AlquilerDAO extends BaseDAO{
	
	
	public void insertarAlquiler(String fecha, Persona objDueno,Programacion cronograma) throws DAOExcepcion {
		System.out.println("Alquiler: insertar(Alquiler alquiler)");
		String query = "INSERT INTO Reserva(fecha,idPersona,IdCronograma) VALUES (?,?,?)";
		Connection con = null;
		PreparedStatement stmt = null;
		try{
			
		con = ConexionBD.obtenerConexion();
		stmt = con.prepareStatement(query);
		stmt.setString(1, fecha);
		stmt.setInt(2, objDueno.getCodigo());
		stmt.setInt(3, cronograma.getCodigo());
		}catch(SQLException e){
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		}finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}
	
		
	public Cancha buscarCancha(String idcancha) throws DAOExcepcion {
		Cancha cancha = null;
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "SELECT * FROM cancha WHERE idcancha = ?";
			con = ConexionBD.obtenerConexion();
			stmt = (PreparedStatement) con.prepareStatement(query);
			stmt.setString(1, idcancha);
			
			rs = stmt.executeQuery();
			if (rs.next()) {
				cancha = new Cancha();
				cancha.setCodigo(rs.getInt("idCancha"));
								}
		} catch (SQLException e) {
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return cancha;
	}



	public void reprogramar(Alquiler alquiler,Programacion cronograma) throws DAOExcepcion, ParseException {
		System.out.println("AlquilerDAO: reprogramar(Alquiler alquiler,Cronograma cronograma)");
		String query = "UPDATE Alquiler VALUES Cronograma_idCronograma = ? WHERE idAlquiler = ?";
		Connection con = null;
		PreparedStatement stmt = null;
		validarFecha(cronograma.getObjProgramacion().getFecha());	
			try {
			if (buscarCronograma(cronograma.getCodigo()) != null) {
			throw new DAOExcepcion("Cancha ya programada para esa fecha");			
			}
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, cronograma.getCodigo());
			stmt.setInt(2, alquiler.getCodigo());
			
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}

	private void validarFecha(String fecha) throws DAOExcepcion, ParseException  {
        String mensaje = "";
        Date fecha2 = null;
        Calendar c1 = Calendar.getInstance();
        Date date2 = (Date) c1.getTime(); 
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); 
        fecha2 = (Date) sdf.parse(fecha);
        
        final long MILLSECS_PER_DAY = 24 * 60 * 60 * 1000;

        long diferencia = ( fecha2.getTime() - date2.getTime() )/MILLSECS_PER_DAY; 
        System.out.println(diferencia); 

        if(diferencia < 30)
            mensaje += "Imposible modificar, fecha fuera del limite permitido" ;
            throw new DAOExcepcion(mensaje);
	}

	public Alquiler buscarCronograma(int codigo) throws DAOExcepcion {
		System.out.println("CronogramaDAO:  buscarCronograma(int codigo))");
		Alquiler alquiler = null;
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "SELECT * FROM Alquiler WHERE Cronograma_idCronograma = ?";
			con = ConexionBD.obtenerConexion();
			stmt = (PreparedStatement)con.prepareStatement(query);
			stmt.setInt(1, codigo);
			rs = stmt.executeQuery();
			if (rs.next()) {
				alquiler = new Alquiler();
				alquiler.setCodigo(rs.getInt("idAlquiler"));
				alquiler.setFecha(rs.getString("fecha"));
				Persona persona = new Persona();
				persona.setCodigo(rs.getInt("Persona_idPersona"));
				alquiler.setPersona(persona);
				Programacion cronograma = new Programacion();
				cronograma.setCodigo(rs.getInt("Cronograma_idCronograma"));
				alquiler.setCronograma(cronograma);
			}
		} catch (SQLException e) {
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return alquiler;
	}

	
	
}